/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.inf.ufg.clinica.persistencia;

import br.inf.ufg.clinica.model.Agenda;
import br.inf.ufg.clinica.model.Medico;
import br.inf.ufg.clinica.model.Paciente;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Gustavo
 */
public class AgendaGravacao implements ServiceHelper<Agenda> {

    private final String ARQUIVO = "agenda.csv";
    private CSVToFile gerenciadorDeArquivo;

    public AgendaGravacao() {
        gerenciadorDeArquivo = new CSVToFile(ARQUIVO);
    }

    @Override
    public boolean gravarObjeto(Agenda agenda) {
        if (!gerenciadorDeArquivo.contem(agenda.getId())) {
            return gerenciadorDeArquivo.gravarLinha(toLine(agenda));
        } else {
            return false;
        }
    }

    @Override
    public void gravarObjetos(List<Agenda> agenda) {
        for (Agenda age : agenda) {
            this.gravarObjeto(age);
        }
    }

    @Override
    public Agenda getObjetoPorId(int id) {
        String linha = gerenciadorDeArquivo.getLinhaPorId(id);
        if (linha != null) {
            Agenda resultado = getObject(linha);
            return resultado;
        } else {
            return null;
        }

    }

    @Override
    public ArrayList<Agenda> getTodosObjetos() {
        List<String> listaObjetos = gerenciadorDeArquivo.getLinhas();
        ArrayList<Agenda> resultado = new ArrayList<>();
        for (String entrada : listaObjetos) {
            Agenda agenda = getObject(entrada);
            resultado.add(agenda);
        }
        return resultado;
    }

    @Override
    public boolean remove(Agenda agenda) {
        return gerenciadorDeArquivo.removerLinha(agenda.getId());
    }

    private String toLine(Agenda i) {
        StringBuilder sb = new StringBuilder();

        sb.append(i.getId());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getPaciente().getId());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getMedico().getId());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getData());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getData_prox());

        return sb.toString();
    }

    private Agenda getObject(String line) {
        String[] agenda = line.split(
                String.valueOf(ServiceHelper.SEPARADOR));

        int id = Integer.parseInt(agenda[0]);
        PacienteGravacao pacienteBD = new PacienteGravacao();
            Paciente paciente = pacienteBD.getObjetoPorId(Integer.parseInt(agenda[1]));
        MedicoGravacao medicoBD = new MedicoGravacao();
                Medico medico = medicoBD.getObjetoPorId(Integer.parseInt(agenda[2]));
                                    
           String data = agenda[3];
           String data_prox = agenda[4];
                                                            
            Agenda resultado = new Agenda(id, paciente, medico, data, data_prox);
        return resultado;
        
       

        
    }

    public void imprimeListaAgenda(ArrayList<Agenda> agenda) {

        System.out.println("LISTA DE AGENDAMENTOS: \n");
        for (Agenda agenda1 : agenda) {
            
            System.out.println("ID: " + agenda1.getId() + "\t Nome do paciente: " + 
            agenda1.getPaciente().getNome() + "\t Nome do médico: " + agenda1.getMedico().getNome() + "\t Data da consulta: " + agenda1.getData() + "\n");
        }
        System.out.println("**************************************************\n");

    }

}
